{
printk(KERN_ALERT "Starting Xen Balloon driver\n");
- most_seen_pages = current_pages = min(start_info.nr_pages,max_pfn);
+ most_seen_pages = current_pages = min(xen_start_info.nr_pages,max_pfn);
if ( (balloon_pde = create_xen_proc_entry("memory_target", 0644)) == NULL )
{
printk(KERN_ALERT "Unable to create balloon driver proc entry!");
/*
* make_module a new phys map if mem= says xen can give us memory to grow
*/
- if ( max_pfn > start_info.nr_pages )
+ if ( max_pfn > xen_start_info.nr_pages )
{
extern unsigned long *phys_to_machine_mapping;
unsigned long *newmap;
newmap = (unsigned long *)vmalloc(max_pfn * sizeof(unsigned long));
memset(newmap, ~0, max_pfn * sizeof(unsigned long));
memcpy(newmap, phys_to_machine_mapping,
- start_info.nr_pages * sizeof(unsigned long));
+ xen_start_info.nr_pages * sizeof(unsigned long));
phys_to_machine_mapping = newmap;
}
case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_DRIVER_STATUS):
C2P(netif_be_driver_status_t, status, Int, Long);
return dict;
+ case TYPE(CMSG_MEM_REQUEST, CMSG_MEM_REQUEST_SET):
+ C2P(mem_request_t, target, Int, Long);
+ C2P(mem_request_t, status, Int, Long);
+ return dict;
}
return PyString_FromStringAndSize(xum->msg.msg, xum->msg.length);
P2C(netif_fe_driver_status_t, status, u32);
P2C(netif_fe_driver_status_t, max_handle, u32);
break;
+ case TYPE(CMSG_MEM_REQUEST, CMSG_MEM_REQUEST_SET):
+ P2C(mem_request_t, target, u32);
+ P2C(mem_request_t, status, u32);
+ break;
}
if ( dict_items_parsed != PyDict_Size(payload) )
{'op' : 'inject',
'event' : fileof(sxpr) })
+ def xend_domain_mem_target_set(self, id, mem_target):
+ val = self.xendPost(self.domainurl(id),
+ {'op' : 'mem_target_set',
+ 'target' : mem_target })
+ return val
+
def getAsynchXendClientProtocol():
"""Load AsynchXendClientProtocol on demand to avoid the cost.
"""
except Exception, ex:
raise XendError(str(ex))
+ def domain_mem_target_set(self, id, target):
+ return xend.domain_mem_target_set(id, target)
+
+
def instance():
"""Singleton constructor. Use this instead of the class constructor.
raise XendError('No domain controller: %s' % dom)
ctrl.shutdown(reason)
return 0
+
+ def domain_mem_target_set(self, dom, target):
+ """Set memory target for a domain.
+ """
+ dom = int(dom)
+ ctrl = self.domainCF.getController(dom)
+ if not ctrl:
+ raise XendError('No domain controller: %s' % dom)
+ ctrl.mem_target_set(target)
+ return 0
def instance():
global inst
val = fn(req.args, {'dom': self.dom.id})
return val
+ def op_mem_target_set(self, op, req):
+ fn = FormFn(self.xd.domain_mem_target_set,
+ [['dom', 'str'],
+ ['target', 'int']])
+ val = fn(req.args, {'dom': self.dom.id})
+ return val
+
def render_POST(self, req):
return self.perform(req)
def render_GET(self, req):
op = req.args.get('op')
- if op and op[0] in ['vifs', 'vif', 'vbds', 'vbd']:
+ if op and op[0] in ['vifs', 'vif', 'vbds', 'vbd', 'mem_target_set']:
return self.perform(req)
if self.use_sxp(req):
req.setHeader("Content-Type", sxp.mime_type)
def __init__(self, factory, dom):
controller.Controller.__init__(self, factory, dom)
self.addMethod(CMSG_SHUTDOWN, 0, None)
+ self.addMethod(CMSG_MEM_REQUEST, 0, None)
self.registerChannel()
def shutdown(self, reason):
raise XendError('invalid reason:' + reason)
msg = packMsg(msgtype, {})
self.writeRequest(msg)
+
+ def mem_target_set(self, target):
+ """Set domain memory target in pages.
+ """
+ msg = packMsg('mem_request_t', { 'target' : target * (1 << 8)} )
+ self.writeRequest(msg)
msg_formats.update(shutdown_formats)
#============================================================================
+# Domain memory reservation message.
+#============================================================================
+
+CMSG_MEM_REQUEST = 7
+CMSG_MEM_REQUEST_SET = 0
+
+mem_request_formats = {
+ 'mem_request_t':
+ (CMSG_MEM_REQUEST, CMSG_MEM_REQUEST_SET)
+ }
+
+msg_formats.update(mem_request_formats)
+#============================================================================
class Msg:
pass
xm.prog(ProgMaxmem)
+class ProgBalloon(Prog):
+ group = 'domain'
+ name = 'balloon'
+ info = """Set the domain's memory footprint using the balloon driver."""
+
+ def help(self, args):
+ print args[0], "DOM MEMORY_TARGET"
+ print """\nRequest domain DOM to adjust its memory footprint to
+MEMORY_TARGET megabytes"""
+
+ def main(self, args):
+ if len(args) != 3: self.err("%s: Invalid argument(s)" % args[0])
+ dom = args[1]
+ mem_target = int(args[2])
+ server.xend_domain_mem_target_set(dom, mem_target)
+
+xm.prog(ProgBalloon)
+
class ProgDomid(Prog):
group = 'domain'
name = 'domid'
#define CMSG_NETIF_BE 3 /* Network-device backend */
#define CMSG_NETIF_FE 4 /* Network-device frontend */
#define CMSG_SHUTDOWN 6 /* Shutdown messages */
+#define CMSG_MEM_REQUEST 7 /* Memory reservation reqs */
/******************************************************************************
#define CMSG_SHUTDOWN_SUSPEND 2 /* Create suspend info, then */
/* SHUTDOWN_suspend. */
+
+/******************************************************************************
+ * MEMORY CONTROLS
+ */
+
+#define CMSG_MEM_REQUEST_SET 0 /* Request a domain to set its mem footprint. */
+
+/*
+ * CMSG_MEM_REQUEST:
+ * Request that the domain change its memory reservation.
+ */
+typedef struct {
+ /* OUT */
+ u32 target; /* 0: Target memory reservation in pages. */
+ /* IN */
+ u32 status; /* 4: Return code indicates success or failure. */
+} PACKED mem_request_t; /* 8 bytes */
+
+
#endif /* __DOMAIN_CONTROLLER_H__ */